// function add2(arg1:number,arg2:number):number{
//     return arg1+arg2
// }

// const add2=(arg1:number,arg2:number):number=>arg1+arg2
let add2: (x: number, y: number) => number
add2 = (arg1: number, arg2: number) => arg1 + arg2
add2 = (arg1: number, arg2: number): number => arg1 + arg2

//写法1， 用接口定义函数
// interface Add{
//     (x:number,y:number):number
// }
//写法2，类型别名。tslint推荐这种写法，等同于写法1
type Add = (x: number, y: number) => number

// type isString=string; isString就是string类型，let isString:string;

let addFunc: Add
addFunc = (arg1: number, arg2: number) => arg1 + arg2

//可选参数 （一定是在最后）
type AddFunction = (x: number, y: number, z?: number) => number
// let addFunction:AddFunction
// addFunction=(x:number,y:number,z:number)=>x+y+z
// addFunction=(x:number,y:number)=>x+y

//默认参数
// let addFunction = (arg1: number, arg2: number = 3) => arg1 + arg2
// console.log(addFunction(1));
// console.log(addFunction(2, 5));

//拓展运算符 ...
// const handleData=(arg1:number,...args:number[])=>{
//     // ....
// }

//函数重载
//一个函数可以定义多个不同参数，返回类型不相同的。 在调用时，根据不同个数、参数，自动判断返回相应结果
function handleData(x: string): string[]
function handleData(x: number): number[]
function handleData(x: any): any {
    if (typeof x === 'string') {
        return x.split('')
    } else {
        return x.toString().split('').map((item: any) => Number(item))
    }
}

// handleData('abc');
// handleData(345);
// handleData('abc').map((item)=>{
//     return item.toFixed() // 编译器会提示报错，因为toFixed是数字才有的方法。
// })
// handleData(123).map((item)=>{
//     return item.length // 编译器会提示报错，因为length是string才有的。
// })
// console.log(handleData(345));
